home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / TPTUTR0F.ZIP / PASCAL10.TXT < prev    next >
Text File  |  1996-01-20  |  26KB  |  605 lines

  1.                          Turbo Pascal for DOS Tutorial
  2.                              by Glenn Grotzinger
  3.         Part 10 -- binary files; units, overlays, and include files.
  4.              All parts copyright 1995-6 (c) by Glenn Grotzinger.
  5.  
  6.         There was no prior problem, so lets get started...
  7.  
  8. Typed binary files
  9. ==================
  10. We know that files can be of type text.  We can also make them type "file
  11. of <datatype>".  We can read and write binary data types to disk.  Here's
  12. an example.   Keep in mind that with typed binary files, you can only
  13. read and write the type of file you define it to be.  For the example
  14. below, we can only deal with integers with this file.  The type we may
  15. use may be anything that we have covered up to this point.  We also
  16. will see that reading, accessing and writing of typed binary files will
  17. be no different than accessing text files, except we can not make use
  18. of readln and writeln (as those are for text files only).
  19.  
  20. program integers2disk;
  21. { writing integers 1 thru 10 to a disk data file, then reading 'em back }
  22.    var
  23.      datafile: file of integer;
  24.      i: integer;
  25.    begin
  26.      assign(datafile, 'INTEGERS.DAT');
  27.      rewrite(datafile);
  28.      for i := 1 to 10 do
  29.        write(datafile, i);
  30.      close(datafile);  { done with write }
  31.      reset(datafile);  { now lets start reading }
  32.      read(datafile, i);
  33.      while not eof(datafile) do { we can use the same concept }
  34.        begin
  35.          writeln(i);
  36.          read(datafile, i);
  37.        end;
  38.      writeln(i);
  39.      close(datafile);
  40.    end.
  41.  
  42. You will notice the numbers 1 through 10 come up.  Look for the file
  43. named INTEGERS.DAT, and then load it up in a text editor.  You will
  44. notice that the file is essentially garbage to the human eye.  That,
  45. as you see, is how the computer sees integers.  In part 11, I will
  46. explain storage methods of many many different variables, and introduce
  47. a few new types of things we can define.  We can use records, integers,
  48. characters, strings, whatever...with a typed file as long as we comply
  49. with the specific type we assign a file to be in the var line.
  50.  
  51. Untyped Binary Files
  52. ====================
  53. We can also open binary files as an untyped, unscratched (essentially)
  54. file.  There we simply use the declaration "file". (I think this is ver7
  55. dependent, am I right?)  Anyway, in addition to this, we have to learn
  56. a few new commands in order to use untyped files.
  57.  
  58. BLOCKREAD(filevar, varlocation, size of varlocation, totalread);
  59.  
  60. filevar is the untyped file variable.
  61. varlocation is the location of where we read the variable into.
  62. size of varlocation is how big varlocation is.
  63. totalread is how much of varlocation that was readable. (optional)
  64.  
  65. BLOCKWRITE(filevar, varlocation, totalread, totalwritten);
  66.  
  67. filevar is the untyped file variable.
  68. varlocation is the location of where we read the variable into.
  69. totalread is how much of varlocation was readable. (optional)
  70. totalwritten is how much of varlocation that was written. (optional)
  71.  
  72. SizeOf(varlocation)
  73.  
  74. Function that gives total size of a variable in bytes.
  75.  
  76. Maximum readable by BlockRead: 64KB.
  77.  
  78. Reset and Rewrite have a record size parameter if we deal with an untyped
  79. file.
  80.  
  81. Probably, the best thing to make things clearer is to give an example.
  82. This program does the same thing as the last one does, but only with
  83. an untyped file.  See the differences in processing...
  84.  
  85. program int2untypedfile;
  86.  
  87.   var
  88.     datafile: file;
  89.     i: integer;
  90.     numread: integer;
  91.  
  92.   begin
  93.     clrscr;
  94.     assign(datafile, 'INTEGERS.DAT');
  95.     rewrite(datafile, 1);
  96.     for i := 1 to 10 do
  97.       blockwrite(datafile, i, sizeof(i));
  98.     close(datafile);
  99.     reset(datafile, 1);
  100.     blockread(datafile, i, sizeof(i), numread);
  101.     while numread <> 0 do
  102.       begin
  103.         writeln(i);
  104.         blockread(datafile, i, sizeof(i), numread);
  105.       end;
  106.     close(datafile);
  107.   end.
  108.       
  109. This program performs essentially the same function as the first example
  110. program, but we are using an untyped file.  Blockread and blockwrite are
  111. used in very limited manners here.  It's *VERY GOOD* for you to experiment
  112. with their use!!!!!!!   As far as the EOF goes on a comparison, blockread
  113. returns how many records it actually read.  We use that as an equivalent.
  114.  
  115. The 2 missing DOS file functions
  116. ================================
  117. We now have the tools to perform the 2 missing DOS file functions that you
  118. probably recognized were gone from part 8, copying files, and moving files.
  119.  
  120. Copying files essentially, is repeated blockreads and blockwrites until
  121. all the input file is read and all the output file is written.  We can
  122. do it with either typed or untyped files.  An untyped file example may
  123. be found on page 14 of the Turbo Pascal 7.0 Programmer's Reference.
  124. For those who do not have this reference...Snippet of my own...untested...
  125.  
  126. while (numread <> 0) or (bytesw = bytesr)
  127.   begin
  128.     blockread(infile, rarray, sizeof(rarray), bytesr);
  129.     blockwrite(outfile, rarray, bytesr, bytesw);
  130.   end;
  131.  
  132. Moving files is a copy of an input file to a new location, followed by
  133. erasure of the input file.
  134.  
  135. Units
  136. =====
  137. A unit is what you see probably on your drive in the TP/units directory.
  138. Compiled units are TPU files.  They are accessed via USES clauses at the
  139. start.  CRT, DOS, and WinDos are some of the provided units we have already
  140. encountered.  Nothing is stopping us from writing our own, though.  The
  141. actual coding of procedures/functions that we place into units is no
  142. different.  The format of the unit, though, is something we need to think
  143. about.  An example is the best thing for that.  This is a simple
  144. implementation of a unit, with examples to give you some idea of a
  145. skeleton to place procedures and functions into.
  146.  
  147. unit myunit;
  148.  
  149.   interface
  150.      { all global const, type, and var variables go here as well as any
  151.        code we may want to run as initialization for starting the unit. }
  152.  
  153.      { procedures and function headers are listed here }
  154.  
  155.      procedure writehello(str: string);
  156.  
  157.   implementation
  158.      { actual procedural code goes here, as it would in a regular program }
  159.  
  160.      procedure writehello(str: string);  { must be same as above }
  161.        begin
  162.          writeln(str);
  163.        end;
  164.  
  165.   end.
  166.  
  167. The unit up above is compilable to disk/memory, but unrunable.  Essentially,
  168. what it is is a library of procedures/functions that we may use in other
  169. programs.  Let's get an example out on how to use one of our own units.
  170.  
  171. program tmyunit; uses myunit; { must match ID at beginning }
  172.   var
  173.     str: string;
  174.   begin
  175.     str := 'Hello!  Courtesy of myunit!';
  176.     writehello(str);
  177.   end.
  178.  
  179. Though this program/unit combination is ludicrous, it does illustrate
  180. exactly how to incorporate your own unit with MANY functions into your
  181. programming, if your project gets too big, or for portability's sake
  182. on some of your frequently used procedures.
  183.  
  184. Overlays
  185. ========
  186. This will describe how to use TP's overlay facility.  It must be used with
  187. units.  Typically, my thoughts are that if you get a large enough project
  188. to dictate the use of overlays (we can use 'em on anysize projects, but
  189. the memory taken up by the overlay manager far uses more memory on smaller
  190. projects to make it an advantage to habitually do this).  We will use
  191. the overlay facility with the unit/program set above for example purposes.
  192.  
  193. ONLY CODE IN UNITS HAVE AN OPPORTUNITY TO BE OVERLAID!  System, CRT, Graph,
  194. and Overlay (if I remember right) are non-overlayable.
  195.  
  196. {$O+} is a compiler directive for UNITS only which designate a unit which
  197. is OK to overlay.  {$O-} is the default, which says it's not OK to overlay
  198. a unit.
  199.  
  200. To get to the overlay manager, we must use the overlay unit.
  201.  
  202. After the overlay unit, we need to use the {$O <TPU name>} compiler
  203. directive to specify which units that we want to compile as an overlay.
  204.  
  205. WARNING: It is good to check your conversion to overlays in a program
  206. with a copy of your source code.  If you alter it with overlays in mind
  207. and it doesn't work (it's known to happen -- a procedure works ONLY when
  208. it's not overlaid...), you won't have to go through the work to alter
  209. it back if it doesn't work right...
  210.  
  211. NOTE: You must compile to disk, then run when you work with overlays.
  212.  
  213. Results come back in the OvrResult variable.  Here's a list...
  214.  
  215.                   0       Success
  216.                  -1       Overlay manager error.
  217.                  -2       Overlay file not found.
  218.                  -3       Not enough memory for overlay buffer.
  219.                  -4       Overlay I/O error.
  220.                  -5       No EMS driver installed.
  221.                  -6       Not enough EMS memory.
  222.  
  223. As for examples, let's look at the unit set up to overlay.  As we can
  224. see, the only real difference (which is a good policy to make), is that
  225. there is the {$O+} compiler directive there now...
  226.  
  227. {$O+}
  228. unit myunit;
  229.  
  230.   interface
  231.      { all global const, type, and var variables go here as well as any
  232.        code we may want to run as initialization for starting the unit. }
  233.  
  234.      { procedures and function headers are listed here }
  235.  
  236.      procedure writehello(str: string);
  237.  
  238.   implementation
  239.      { actual procedural code goes here, as it would in a regular program }
  240.  
  241.      procedure writehello(str: string);  { must be same as above }
  242.        begin
  243.          writeln(str);
  244.        end;
  245.  
  246.   end.
  247.  
  248. Now lets look into the program itself.  It's error-reporting from the
  249. overlay manager isn't great.  It stops the program if the overlay won't
  250. load, but doesn't do a thing, really, with the ems section.
  251.  
  252. program tmyunit; uses myunit, overlay;
  253.  
  254.   {$O MYUNIT.TPU}        { include myunit in the overlay }
  255.   var
  256.     str: string;
  257.   begin
  258.     ovrinit('TMYUNIT.OVR'); { final overlay file name/init for program. }
  259.     if OvrResult <> 0 then
  260.       begin
  261.         writeln('There is a problem');
  262.         halt(1);
  263.       end
  264.     else
  265.       write('Overlay installed ');
  266.     ovrinitems;        {init overlay for EMS.  Usable after ovrinit}
  267.     if OvrResult <> 0 then
  268.       writeln('There was a problem putting the overlay in EMS')
  269.     else
  270.       writeln('in EMS memory.');
  271.     str := 'Hello!  Courtesy of myunit!';
  272.     writeln;
  273.     writehello(str);
  274.   end.
  275.  
  276. EXE Overlays
  277. ============
  278. Here's how to set up EXE overlays.  The DOS copy command features the B
  279. switch.  For example, to take the programs source file above and attach the
  280. overlay to the end of the EXE (be sure you run any exe packers/encryptors
  281. before you do this!), use the following:
  282.  
  283.         COPY /B TMYUNIT.EXE+TMYUNIT.OVR
  284.  
  285. Then the change that needs to be made in the source for the program is to
  286. change the overinit line to read TMYUNIT.EXE instead of TMYUNIT.OVR.  You
  287. should be able to handle doing this and understanding what is going on.
  288.  
  289. Include Files
  290. =============
  291. Use the {$I <filename>} compiler directive at the position the include
  292. file is to be placed.  An include file is code that is in another file,
  293. which may be considered as "part of the program" at the position the
  294. {$I ..} compiler directive is at.
  295.  
  296. Copy function
  297. =============
  298. You can use the copy function to get a portion of a string into another
  299. part of a string.  For example...
  300.  
  301.         str := copy('TurboPascal', 5, 3);
  302.         writeln(str);      { writes oPa }
  303.  
  304. Programming Practice for Part #10
  305. =================================
  306. We have opened ourselves a business selling computer equipment in 1993.
  307. Since we have occupied ourselves with working on computers, and not on
  308. bookkeeping (we wanted to save the funds instead of hiring someone), and
  309. rather not use the cash registers, we have done everything on paper over
  310. the last two years.  It's the beginning of 1996, and any accurate records
  311. of sales progression, as well as records of our customers has become
  312. almost impossible, since our records are represented by a closet-full of
  313. paper.  So, we finally have decided to get things into computer.
  314.  
  315. To do the typing, we have temporarily hired interns from a nearby business
  316. college.  Unfortunately, with our limited funds, we could not draw in
  317. people who had sufficient typing skill and accuracy, but we took what
  318. we could get.  We now have things typed in as text files with 80 columns
  319. a line.  Unfortunately, the interns' attention to detail has been as bad
  320. as their typing skill, and nothing makes sense in their work.
  321.  
  322. Our purposes is to save our money in hiring these interns and locate the
  323. badly entered records, while writing the good records to a solid binary
  324. data file by the name of COMPHVN.DAT.  For the bad records, on EACH AND
  325. EVERY error we encounter, we should write a text message with the first
  326. 20 characters of the problem line and a description of what is wrong with
  327. the data set for that particular error so we may go back through and make
  328. the interns redo what they did wrong to a text file named ERRORS.LOG.
  329.  
  330. The data format for the output file COMPHVN.DAT is as follows.  For
  331. interest of efficiency, we shall write this program using COMPHVN.DAT
  332. as an untyped file.  As the person posing this problem, I realize that
  333. some of the data types in this record will not be recognizable at this
  334. point, but with the variable description, you will know how to handle
  335. them, and in part 11, you will see what they are exactly.  In creating
  336. a binary file, we must always be concerned with using the least amount
  337. of space as effectively as possible.   Uses of the variables will be
  338. explained later.  For interest of typing efficiency on your parts,
  339. I am asking that you cut and paste this record description out of this
  340. description and save it as a text file named COMPHVN.INC, which may be
  341. used as an include file in our compilation.
  342.  
  343.   comphvndata = record
  344.       datacode: string[7];  
  345.       acct_classification: char;
  346.       phone_area: integer;   {area+prefix+exchange = phone number}
  347.       phone_prefix: integer;
  348.       phone_exchange: integer;
  349.       work_area: integer;
  350.       work_prefix: integer;
  351.       work_exchange: integer;
  352.       other_area: integer;
  353.       other_prefix: integer;
  354.       other_exchange: integer;
  355.       cnct1_lname: string[16];
  356.       cnct1_fname: string[11];
  357.       cnct1_minit: char;
  358.       cnct1_pobox: integer;
  359.       cnct1_sname: string[8];
  360.       cnct1_stype: string[4];
  361.       cnct1_apt: integer;
  362.       cnct1_city: string[10];
  363.       cnct1_state: string[2];
  364.       cnct1_zip: longint;
  365.       cnct1_birthm: byte;
  366.       cnct1_birthd: byte;
  367.       cnct1_birthy: integer;
  368.       accept_check: boolean;
  369.       accept_credt: boolean;
  370.       balnce_credt: real;
  371.       total_sold: real;
  372.       cnct1_emp_code: string[4];
  373.       total_sales: integer;
  374.       emp_name: string[10];
  375.       emp_stnum: integer;
  376.       emp_sttype: string[4];
  377.       emp_city: string[10];
  378.       emp_state: string[2];
  379.       emp_zip: longint;
  380.       emp_area: integer;
  381.       emp_prefix: integer;
  382.       emp_exchange: integer;
  383.       emp_yrs: byte;
  384.       compu: boolean;
  385.       compu_type: string[9];
  386.       compu_mon: char;
  387.       compu_cdr: boolean;
  388.       compu_cdt: char;
  389.       compu_mem: byte;
  390.       minor: boolean;
  391.    end;
  392.  
  393. The format for our INPUT file, which will be named INDATA.TXT, will be as
  394. follows (80 characters).  Since we had 15 interns doing the typing at once
  395. we also had them merge their work.  They were careless, and may have not
  396. accomplished it properly.  There will be three lines for each customer
  397. that we have encountered.
  398.  
  399. Line 1                                 Line 2
  400. --------------------------------------------------------------------                                  
  401. datacode              columns 1-7     datacode         columns 1-7
  402. acct_classification   column 8        accept_check     column 8
  403. sequence number       column 9        sequence number  column 9
  404. phone_area            columns 10-12   cnct1_stype      columns 10-13
  405. phone_prefix          columns 13-15   cnct1_apt        columns 14-17
  406. phone_exchange        columns 16-19   cnct1_city       columns 18-27
  407. work_area             columns 20-22   cnct1_state      columns 28-29
  408. work_prefix           columns 23-25   cnct1_zip        columns 30-38
  409. work_exchange         columns 26-29   cnct1_birthm     columns 39-40
  410. other_area            columns 30-32   cnct1_birthd     columns 41-42
  411. other_prefix          columns 33-35   cnct1_birthy     columns 43-46
  412. other_exchange        columns 36-39   balnce_credt     columns 47-55
  413. cnct1_lname           columns 40-55   total_sold       columns 56-63
  414. cnct1_fname           columns 56-66   cnct1_emp_code   columns 64-67
  415. cnct1_minit           column 67       total_sales      columns 68-70
  416. cnct1_pobox           columns 68-72   emp_name         columbs 71-80
  417. cnct1_sname           columns 73-80
  418.  
  419. Line 3
  420. --------------------------------------------------------------------
  421. datacode              columns 1-7
  422. accept_credt          column 8
  423. sequence number       column 9
  424. emp_stnum             column 10-13
  425. emp_sttype            column 14-17
  426. emp_city              column 18-27
  427. emp_state             column 28-29
  428. emp_zip               column 30-38
  429. emp_area              column 39-41
  430. emp_prefix            column 42-44
  431. emp_exchange          column 45-48
  432. emp_yrs               column 49-50
  433. compu                 column 51
  434. compu_type            column 52-60
  435. compu_mon             column 61
  436. compu-cdr             column 62
  437. compu_cdt             column 63
  438. compu_mem             column 64-65
  439. minor                 column 66
  440. spaces                column 67-80
  441.  
  442. Now, a description as to what is defined as a correct set that we should
  443. write to COMPHVN.DAT.
  444.  
  445. 1) Each 3 lines that are read are considered for errors.  Check the sequence
  446. numbers.  The first line's sequence number should be 1, for example.  A
  447. successful read of 3 lines should say 1, 2 and 3 in that order.  For example,
  448. in our error reporting, if you have a read of 1,2,2 , you should not write
  449. the group to the binary file, and report a duplicate line #2 and a missing
  450. line #3.  There will not ever be a circumstance where these sequence numbers
  451. will all be the same...The cases covered in this paragraph would be the only
  452. cases that would ever forstall processing of error-checks listed in points
  453. 2-14.
  454.  
  455. 2) Datacode on lines 1, 2 and 3 should MATCH exactly and be checked for the
  456. following: It has the format, for example, with my name of GROTZ*G, and
  457. should be verified using the cnct1_names...
  458.  
  459. 3) phone_area, phone_prefix, phone_exchange, work_area, work_prefix, work_
  460. exchange, other_area, other_prefix, other_exchange, pobox, emp_zip, emp_
  461. area, emp_prefix, emp_exchange, emp_yrs, cnct1_zip, cnct1_birthm, cnct1_
  462. birthd, cnct1_birthy, balance_credt, total_sold, total_sales, compu_mem
  463. all should be checked to verify that they are numeric in origin.
  464.  
  465. 4) phone_prefix, work_prefix, other_prefix, emp_prefix all should not start
  466. with a 1 or a 0.
  467.  
  468. 5) cnct1_birthy should be in this century 1900-1999.
  469.  
  470. 6) acct_classification should be B,C,G,P, or O.
  471.  
  472. 7) accept_check, accept_credt, compu, compu_cdr, and minor should be
  473. Y or N.
  474.  
  475. 8) emp_yrs (employed how many years?) should be checked with cnct1_birthy
  476. for sanity (a person who was born in 1980 cant have worked 20 years).
  477.  
  478. 9) If compu is N, then compu_type, compu_mon, compu_cdr, compu_cdt, and
  479. compu_mem should be either blank or 0 depending upon the type of field.
  480.  
  481. 10) cnct1_emp_code should be GOVT, RET, STUD, or BUS.  If this field is
  482. RET, then emp_* should either be blank or 0 depending on the type of field.
  483.  
  484. 11) compu_mon should be S, V, E, C, H, or I.
  485.  
  486. 12) compu_cdt should be 1, 2, 4, 6, or 8.
  487.  
  488. 13) emp_sttype and cnct1_stype should be BLVD, LANE, ST, AVE, CT, LOOP,
  489.     DR, CIRC, or RR.
  490.  
  491. 14) minor should be Y if person listed in cnct1_?name is < 21 years old 
  492. and N otherwise.  Check to be sure that this field is correct in being
  493. Y or N.
  494.  
  495. Format of ERRORS.LOG (also solution to the INDATA.TXT posted below)
  496. --------------------
  497.  
  498.                         Error Report -- INDATA.TXT
  499.                         --------------------------
  500.  
  501.   First 20 characters of line    Problem
  502.   ---------------------------    --------------------------
  503.   GROA2*GN334  ST  WAR           Datacode does not agree with name.
  504.   GROT2*GP181612932918           Work-exchange is not numeric.
  505.   GROT2*GP181612932918           phone-prefix started with a 0 or 1.
  506.   GROT2*GT2ST  314 SED           accept-check is invalid.
  507.   GROT3*GP181642932918           Duplicate line #1
  508.   GROT3*GN234  ST  WAR           Missing line #3
  509.   GROT4*GI181642932918           Datacode does not agree with name.
  510.   GROT4*GY2ST  314 SED           Datacode does not agree with name.
  511.   GROT4*GN334  ST  WAR           Datacode does not agree with name.
  512.   GROT4*GY2ST  314 SED           cnct1-birthy is not in this century.
  513.   GROT4*GI181642932918           acct-classification is invalid.
  514.   GROT7*GN334  ST  WAR           emp-zip is not numeric.
  515.   GROT7*GN334  ST  WAR           compu-cdr is invalid.
  516.   GROT7*GN334  ST  WAR           The emp-yrs doesn't make sense.
  517.   GROT7*GN334  ST  WAR           There were fields present when compu was N.
  518.   GROT7*GN334  ST  WAR           compu-mon is invalid.
  519.   GROT7*GN334  ST  WAR           compu-cdt is invalid.
  520.   GROT8*GN334  ST  WAR           empcodes are present when RET is true.
  521.   GROT8*GN334  ST  WAR           compu-mon is invalid.
  522.   GROT0*GN334  STR WAR           compu-cdt is invalid.
  523.   GROT0*GN334  STR WAR           emp-sttype is invalid.
  524.  
  525.  
  526.  
  527. Remember to be as general as possible on your error messages. Use the
  528. example listed above as a guide. Your program can not predict everything.
  529. Also, in the interest of finding out your programming skill, we ask that
  530. you code this program using the pascal overlay system with EMS load
  531. capability, with all error codes and status statements active and visible
  532. to the user, for at least one procedure or function.  Also note, that many
  533. of the separate integer fields are put together in the input file, so we
  534. can not just plain read the input file.
  535.  
  536. Here is a copy of the current input file, INDATA.TXT
  537. (keep in mind it's 80 characters per line, and the character
  538. positions MATTER)
  539. ----------------------------------------------------
  540. GROT1*GP1816429329181674700008163475753GROT1INGER      GLENN      K232  34th
  541. GROT1*GY2ST  314 SEDALIA   MO64093    062519742.34     3245.23 STUD32 CMSU
  542. GROT1*GN334  ST  WARRENSBURMO65337    81654341114 YHOMEBUILTVY18 N
  543. GROT2*GP18161293291816747000A8163475753GROT2INGER      GLENN      K232  34th
  544. GROT2*GT2ST  314 SEDALIA   MO64093    062519742.34     3245.23 STUD32 CMSU
  545. GROA2*GN334  ST  WARRENSBURMO65337    81654341114 YHOMEBUILTVY18 N
  546. GROT3*GP1816429329181674700008163475753GROT3INGER      GLENN      K232  34th
  547. GROT3*GY1ST  314 SEDALIA   MO64093    062519742.34     3245.23 STUD32 CMSU
  548. GROT3*GN234  ST  WARRENSBURMO65337    81654341114 YHOMEBUILTVY18 N
  549. GROT4*GI1816429329181674700008163475753BROT4INGER      GLENN      K2E2  34th
  550. GROT4*GY2ST  314 SEDALIA   MO64093    062518742.34     3245.23 STUD32 CMSU
  551. GROT4*GN334  ST  WARRENSBURMO65337    81654341114 YHOMEBUILTVY18 N
  552. GROT5*GP1816429329181674700008163475753GROT5INGER      GLENN      K232  34th
  553. GROT5*GY2ST  314 SEDALIA   MO64093    062519742.34     3245.23 STUD32 CMSU
  554. GROT5*GN334  ST  WARRENSBURMO65337    81654341114 YHOMEBUILTVY18 N
  555. GROT6*GP1816429329181674700008163475753GROT6INGER      GLENN      K232  34th
  556. GROT6*GY2ST  314 SEDALIA   MO64093    062519742.34     3245.23 STUD32 CMSU
  557. GROT6*GN334  ST  WARRENSBURMO65337    81654341114 YHOMEBUILTVY18 N
  558. GROT7*GP1816429329181674700008163475753GROT7INGER      GLENN      K232  34th
  559. GROT7*GY2ST  314 SEDALIA   MO64093    062519742.34     3245.23 STUD32 CMSU
  560. GROT7*GN334  ST  WARRENSBURMO65W37    816543411134NHOMEBUILT  00 N
  561. GROT8*GP1816429329181674700008163475753GROT8INGER      GLENN      K232  34th
  562. GROT8*GY2ST  314 SEDALIA   MO64093    062519742.34     3245.23 RET 32 CMSU
  563. GROT8*GN334  ST  WARRENSBURMO65337    81654341114 YHOMEBUILTZY18 N
  564. GROT9*GP1816429329181674700008163475753GROT9INGER      GLENN      K232  34th
  565. GROT9*GY2ST  314 SEDALIA   MO64093    062519742.34     3245.23 STUD32 CMSU
  566. GROT9*GN334  ST  WARRENSBURMO65337    81654341114 YHOMEBUILTVY18 N
  567. GROT0*GP1816429329181674700008163475753GROT0INGER      GLENN      K232  34th
  568. GROT0*GY2ST  314 SEDALIA   MO64093    062519742.34     3245.23 STUD32 CMSU
  569. GROT0*GN334  STR WARRENSBURMO65337    81654341114 YHOMEBUILTVYA8 N
  570.  
  571.  
  572. Notes
  573. -----
  574. 1) You may use a for loop to read each set of 3 lines.  I will not throw
  575. an error of omission of lines into the data file.  There will always
  576. be multiples of 3 lines to work with.
  577.  
  578. 2) The included data file in this text file includes errors from all 14
  579. points listed above.  The data file I use for the contest will be different,
  580. but will as well cover all 14 points listed above...
  581.  
  582. 3) Be sure to get good use of your debugger, as you will NEED it...Also, be
  583. sure to plan the program -- this is an easy one, yet it's complex because
  584. of the amount of planning it requires...plan well, it's easy.  Don't plan
  585. well, it's a bugger...:>
  586.  
  587. 4) ONE hint: remember string addressing, and use of the copy procedure.
  588.  
  589. 5) Another hint.  You can have what is referred to as "next sentence"
  590. IF THEN ELSE statements.  It is very good in this program to be able to
  591. use them.  (if condition then else) is essentially, a do nothing if con-
  592. dition is true situation.  I suggest it because the pascal operator NOT
  593. seems to not work right in all cases. :<
  594.  
  595. Also, keep in mind that this is the part 10 practice, too, so be sure to
  596. at least attempt it!
  597.  
  598. Next Time
  599. =========
  600. Interfacing with a common format; how data types are stored in memory and
  601. on disk.  You may wish to obtain use of a hex viewer for this next part.
  602. Send comments to ggrotz@2sprint.net.
  603.  
  604.  
  605.